package org.vgou.page;

import javax.servlet.http.HttpServletRequest;

import org.vgou.util.WebConstants;

/**
 * Assists JSP writers in getting parameters and attributes.
 */
public class ParamUtils {

	/**
	 * Returns a parameter as a string.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return the value of the parameter or null if the parameter was not found
	 *         or if the parameter is a zero-length string.
	 */
	public static String getParameter(HttpServletRequest request, String name) {
		return getParameter(request, name, false);
	}

	/**
	 * Returns a parameter as a string.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @param emptyStringsOK
	 *            teturn the parameter values even if it is an empty string.
	 * @return the value of the parameter or null if the parameter was not
	 *         found.
	 */
	public static String getParameter(HttpServletRequest request, String name,
			boolean emptyStringsOK) {
		String temp = request.getParameter(name);
		if (temp != null) {
			if (temp.equals("") && !emptyStringsOK) {
				return null;
			} else {
				return temp;
			}
		} else {
			return null;
		}
	}

	/**
	 * Returns a list of parameters of the same name
	 * 
	 * @param request
	 *            an HttpServletRequest object.
	 * @return an array of non-null, non-blank strings of the same name. This
	 *         method will return an empty array if no parameters were found.
	 */
	public static String[] getParameters(HttpServletRequest request, String name) {
		if (name == null) {
			return new String[0];
		}
		String[] paramValues = request.getParameterValues(name);
		if (paramValues == null || paramValues.length == 0) {
			return new String[0];
		} else {
			java.util.List values = new java.util.ArrayList(paramValues.length);
			for (int i = 0; i < paramValues.length; i++) {
				if (paramValues[i] != null && !"".equals(paramValues[i])) {
					values.add(paramValues[i]);
				}
			}
			return (String[]) values.toArray(new String[] {});
		}
	}

	/**
	 * Returns a parameter as a boolean.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return true if the value of the parameter was "true", false otherwise.
	 */
	public static boolean getBooleanParameter(HttpServletRequest request,
			String name) {
		return getBooleanParameter(request, name, false);
	}

	/**
	 * Returns a parameter as a boolean.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return true if the value of the parameter was "true", false otherwise.
	 */
	public static boolean getBooleanParameter(HttpServletRequest request,
			String name, boolean defaultVal) {
		String temp = request.getParameter(name);
		if ("true".equals(temp) || "on".equals(temp)) {
			return true;
		} else if ("false".equals(temp) || "off".equals(temp)) {
			return false;
		} else {
			return defaultVal;
		}
	}

	/**
	 * Returns a parameter as an int.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return the int value of the parameter specified or the default value if
	 *         the parameter is not found.
	 */
	public static int getIntParameter(HttpServletRequest request, String name,
			int defaultNum) {
		String temp = request.getParameter(name);
		if (temp != null && !temp.equals("")) {
			int num = defaultNum;
			try {
				num = Integer.parseInt(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * Returns a list of int parameters.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @param defaultNum
	 *            the default value of a parameter, if the parameter can't be
	 *            converted into an int.
	 */
	public static int[] getIntParameters(HttpServletRequest request,
			String name, int defaultNum) {
		String[] paramValues = request.getParameterValues(name);
		if (paramValues == null || paramValues.length == 0) {
			return new int[0];
		}
		int[] values = new int[paramValues.length];
		for (int i = 0; i < paramValues.length; i++) {
			try {
				values[i] = Integer.parseInt(paramValues[i]);
			} catch (Exception e) {
				values[i] = defaultNum;
			}
		}
		return values;
	}

	/**
	 * Returns a parameter as a float.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return the double value of the parameter specified or the default value
	 *         if the parameter is not found.
	 */
	public static float getFloatParameter(HttpServletRequest request,
			String name, float defaultNum) {
		String temp = request.getParameter(name);
		if (temp != null && !temp.equals("")) {
			float num = defaultNum;
			try {
				num = Float.parseFloat(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}
	
	/**
	 * Returns a parameter as a double.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return the double value of the parameter specified or the default value
	 *         if the parameter is not found.
	 */
	public static double getDoubleParameter(HttpServletRequest request,
			String name, double defaultNum) {
		String temp = request.getParameter(name);
		if (temp != null && !temp.equals("")) {
			double num = defaultNum;
			try {
				num = Double.parseDouble(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * Returns a parameter as a long.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return the long value of the parameter specified or the default value if
	 *         the parameter is not found.
	 */
	public static long getLongParameter(HttpServletRequest request,
			String name, long defaultNum) {
		String temp = request.getParameter(name);
		if (temp != null && !temp.equals("")) {
			long num = defaultNum;
			try {
				num = Long.parseLong(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * Returns a list of long parameters.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @param defaultNum
	 *            the default value of a parameter, if the parameter can't be
	 *            converted into a long.
	 */
	public static long[] getLongParameters(HttpServletRequest request,
			String name, long defaultNum) {
		String[] paramValues = request.getParameterValues(name);
		if (paramValues == null || paramValues.length == 0) {
			return new long[0];
		}
		long[] values = new long[paramValues.length];
		for (int i = 0; i < paramValues.length; i++) {
			try {
				values[i] = Long.parseLong(paramValues[i]);
			} catch (Exception e) {
				values[i] = defaultNum;
			}
		}
		return values;
	}

	/**
	 * Returns an attribute as a string.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get
	 * @return the value of the parameter or null if the parameter was not found
	 *         or if the parameter is a zero-length string.
	 */
	public static String getAttribute(HttpServletRequest request, String name) {
		return getAttribute(request, name, false);
	}

	/**
	 * Returns an attribute as a string.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the parameter you want to get.
	 * @param emptyStringsOK
	 *            return the parameter values even if it is an empty string.
	 * @return the value of the parameter or null if the parameter was not
	 *         found.
	 */
	public static String getAttribute(HttpServletRequest request, String name,
			boolean emptyStringsOK) {
		String temp = (String) request.getAttribute(name);
		if (temp != null) {
			if (temp.equals("") && !emptyStringsOK) {
				return null;
			} else {
				return temp;
			}
		} else {
			return null;
		}
	}

	/**
	 * Returns an attribute as a boolean.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the attribute you want to get.
	 * @return true if the value of the attribute is "true", false otherwise.
	 */
	public static boolean getBooleanAttribute(HttpServletRequest request,
			String name) {
		String temp = (String) request.getAttribute(name);
		if (temp != null && temp.equals("true")) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Returns an attribute as a int.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the attribute you want to get.
	 * @return the int value of the attribute or the default value if the
	 *         attribute is not found or is a zero length string.
	 */
	public static int getIntAttribute(HttpServletRequest request, String name,
			int defaultNum) {
		String temp = (String) request.getAttribute(name);
		if (temp != null && !temp.equals("")) {
			int num = defaultNum;
			try {
				num = Integer.parseInt(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	/**
	 * Returns an attribute as a long.
	 * 
	 * @param request
	 *            the HttpServletRequest object, known as "request" in a JSP
	 *            page.
	 * @param name
	 *            the name of the attribute you want to get.
	 * @return the long value of the attribute or the default value if the
	 *         attribute is not found or is a zero length string.
	 */
	public static long getLongAttribute(HttpServletRequest request,
			String name, long defaultNum) {
		String temp = (String) request.getAttribute(name);
		if (temp != null && !temp.equals("")) {
			long num = defaultNum;
			try {
				num = Long.parseLong(temp);
			} catch (Exception ignored) {
			}
			return num;
		} else {
			return defaultNum;
		}
	}

	public static String getString(HttpServletRequest request, String paramName) {
		String temp = request.getParameter(paramName);
		if (temp != null && !temp.equals("")) {
			try {
				temp = java.net.URLDecoder.decode(temp, WebConstants.ENCODING);
			} catch (Exception e) {
			}
			return temp;
		} else {
			return null;
		}
	}

	public static String getString(HttpServletRequest request,
			String paramName, String defaultString) {
		String temp = getString(request, paramName);
		if (temp == null) {
			try {
				defaultString = java.net.URLDecoder.decode(defaultString,
						WebConstants.ENCODING);
			} catch (Exception e) {
				temp = defaultString;
			}
			temp = defaultString;
		}
		return temp.trim();
	}

	public static int getInt(HttpServletRequest request, String paramName)
			throws NumberFormatException {
		return Integer.parseInt(getString(request, paramName));
	}

	public static int getInt(HttpServletRequest request, String paramName,
			int defaultInt) {
		try {
			String temp = getString(request, paramName);
			if (temp == null) {
				return defaultInt;
			} else {
				return Integer.parseInt(temp);
			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}
		return 0;
	}

	public static long getLong(HttpServletRequest request, String paramName)
			throws NumberFormatException {
		return Long.parseLong(getString(request, paramName));
	}

	public static long getLong(HttpServletRequest request, String paramName,
			int defaultInt) {
		try {
			String temp = getString(request, paramName);
			if (temp == null) {
				return defaultInt;
			} else {
				return Long.parseLong(temp);
			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}
		return 0;
	}
}
